﻿using System.Collections.Generic;
using System.Reflection;
using SistemaFinanceiro.classes.core;
using SistemaFinanceiro.classes.entidades;

namespace SistemaFinanceiro.classes.persistencia
{
    public class GenericoDAO_old<T> : IGenericoDAO<T> where T : GenericoClasse
    {
        protected List<T> listaGenerica = new List<T>();

        private List<T> ListaGenerica
        {
            get { return listaGenerica; }
            set { listaGenerica = value; }
        }


        public virtual T Inserir(T item)
        {
            if (!(item is Usuario))
            {
                Fachada fachada = Fachada.Instancia;
                item.Usuario = fachada.UsuarioLogado;
            }
            listaGenerica.Add(item);
            return item;
        }

        public virtual void Remover(T item)
        {
            listaGenerica.Remove(item);
        }

        public virtual T Salvar(T item)
        {
            Remover(item);
            Inserir(item);

            return item;
        }

        public virtual List<T> Listar()
        {
            Fachada fachada = Fachada.Instancia;
            return listaGenerica.FindAll(item => item.Usuario.Login.ToLower().Equals(fachada.UsuarioLogado.Login.ToLower()));
        }

        public virtual List<T> ListarPorPropriedade(string nomePropriedade, object valor)
        {
            return listaGenerica.FindAll(item => compararPropriedade(item, nomePropriedade, valor));

        }

        public virtual T ProcurarPorPropriedade(string nomePropriedade, object valor)
        {
            return listaGenerica.Find(item => compararPropriedade(item, nomePropriedade, valor));
        }

        private bool compararPropriedade(T item, string nomePropriedade, object valorProcurado)
        {
            // apenas registros do usuário logado podem ser retornados!
            Fachada fachada = Fachada.Instancia;
            Usuario usuarioLogado = fachada.UsuarioLogado;

            if (!(item is Usuario) && (!item.Usuario.Login.ToLower().Equals(usuarioLogado.Login.ToLower())))
            {
                return false;
            }

            bool usarEquals = false;
            if (nomePropriedade.StartsWith("=="))
            {
                nomePropriedade = nomePropriedade.Substring(2);
                usarEquals = true;
            }

            MethodInfo metodo = item.GetType().GetMethod("get_" + nomePropriedade);
            object valor = metodo.Invoke(item, null);
            if (valorProcurado is string)
            {
                if (usarEquals)
                {
                    return ((string)valor).ToLower().Equals(((string)valorProcurado).ToLower());
                }
                else
                {
                    return ((string)valor).ToLower().Contains(((string)valorProcurado).ToLower());
                }
            }
            return valorProcurado.Equals(valor);
        }

    }
}
